import os #引入tkinter处理界面
import tkinter #引入tkinter处理界面
import tkinter.filedialog #调用上传文件窗口类
import math
import threading #多线程
import string

files = []
result = []
def FileSelect():#文件选择
    files.clear()
    filename = tkinter.filedialog.askopenfilenames() #弹出多文件选择窗
    if(len(filename)==0):
        textbox.insert('end', "未选择任何文件！\n")
        root.update()
        print("未选择任何文件！\n")
    else:
        textbox.insert('end', "已选择文件\n")
        for i in filename:
            files.append(i)
            print("\t\t%s\n"%(i))
            textbox.insert('end', "%s\n"%(i))
            textbox.see(tkinter.END)
            root.update()
    return 0

def MyThreading(num1,num2): #线程执行
    for i in range(num1,num2):
        print("打开文件%s"%(files[i]))
        #search(files[i],searchText)
        #打开当前目录下的result.txt文件，如果没有则创建
        filenames = files[i]
        readfile = open(filenames)
        outfile = open('result.txt','a+')
        outfile.writelines(readfile)
        outfile.write('\n')
        #关闭文件 
        outfile.close()
        readfile.close()
    return 0
def NewResult():
    if os.path.exists("new.txt") : os.remove("new.txt")
    readDir = "result.txt"  #old
    writeDir = "new.txt" #new
    lines_seen = set()
    outfile = open(writeDir, "w")
    f = open(readDir, "r")
    for line in f:
        if line not in lines_seen:
            outfile.write(line)
            lines_seen.add(line)
    outfile.close()
    textbox.insert('end', "清除成功，文件名称：new.txt\n")

def start():
    if os.path.exists("result.txt") : os.remove("result.txt")
    if len(files)==0:
        print("未上传文件")
        textbox.insert('end', "错误：未上传文件\n")
        root.update()
        return 0
    print("正在执行")
    textbox.insert('end', "正在执行,页面可能稍有卡顿，请耐心等待\n")
    root.update()
 
    ThreadLen=10 if len(files)>10 else 1 #文件数量若小于10则只开一个线程
    ThreadArr=[]
    if ThreadLen>1:
        for i in range(ThreadLen):#追加十个线程（若需要）
            bei=math.floor(len(files)/ThreadLen)
            print("执行线程%d至%d"%((i*bei),(i*bei+bei)))
            t=threading.Thread(target=MyThreading,args=((i*bei),(i*bei+bei)))
            ThreadArr.append(t)
 
    #追加线程执行剩余文件搜索
    print("执行线程%d至%d"%(0,len(files)))
    t=threading.Thread(target=MyThreading,args=(0,len(files)))
    ThreadArr.append(t)
    for i in ThreadArr:
        i.start() #循环执行所有线程
    for i in ThreadArr:
        i.join() #循环等待所有线程执行结束
 
    print("执行结束")
 
    

    textbox.insert('end', "合并成功，文件名称为：result.txt\n")
    result.clear()
    textbox.see(tkinter.END) #查看文本框底部
    root.update() #更新文本框

#构建用户界面
root = tkinter.Tk()
root.title("批量处理txt文件") #窗口标题
root.geometry('450x300+585+265') #初始化窗口大小和位置
root.resizable(0, 0) #设置窗口大小不可更改
  
#上传文件按钮
getFile = tkinter.Button(root,text="点击选择文件",command= FileSelect).grid(row=1,column=0,columnspan=2,padx=40,pady=5)
  
#开始按钮
startBtn = tkinter.Button(root,text="开始合并",command= start).grid(row=2,column=0,columnspan=2,padx=40,pady=5)

#清除重复
delBtn = tkinter.Button(root,text="清除重复记录",command= NewResult).grid(row=3,column=0,columnspan=2,padx=40,pady=5)

#消息框
textbox = tkinter.Text(root,width=50,height=10)
textbox.grid(row=4,column=0,columnspan=2,padx=40,pady=5)
textbox.insert("end", "日志消息：\n")
  
root.mainloop() #执行